#include <bits/stdc++.h>
using namespace std;

using ll = long long;

// 线段树
#define lc p << 1
#define rc p << 1 | 1
const int N = 100005;
// int n, w[N];
ll w[N];
struct Node
{
    ll l, r, sum, add;
} tr[N * 4];

// 向上更新
void pushUp(int p)
{
    tr[p].sum=tr[lc].sum+tr[rc].sum;
}
// 向下更新
void pushDown(int p)
{
    if(tr[p].add){
        tr[lc].sum+=tr[p].add*(tr[lc].r-tr[lc].l+1);//+=
        tr[rc].sum+=tr[p].add*(tr[rc].r-tr[rc].l+1);//
        tr[lc].add+=tr[p].add;
        tr[rc].add+=tr[p].add;
        tr[p].add=0;        
    }
}
// 构建
void build(int p, int l, int r)
{
    tr[p]={l,r,w[l],0};
    if(l==r) return;
    int m = l+r>>1;
    build(lc,l,m);
    build(rc,m+1,r);
    pushUp(p);
}
// 更新
void update(int p, int x, int y, ll k)
{
    if(x<=tr[p].l && tr[p].r<=y){//r
        tr[p].sum+=(tr[p].r-tr[p].l+1)*k;
        tr[p].add+=k;
        return;
    }
    int m=tr[p].l+tr[p].r>>1;
    pushDown(p);
    if(x<=m) update(lc,x,y,k);
    if(y>m) update(rc,x,y,k);
    pushUp(p);//pushUp(p);
}
// 查询
ll query(int p, int x, int y)
{
    if(x<=tr[p].l && tr[p].r<=y)
        return tr[p].sum;
    int m = tr[p].l+tr[p].r>>1;
    pushDown(p);
    ll sum=0;
    if(x<=m) sum+=query(lc,x,y);
    if(y>m) sum+=query(rc,x,y);
    return sum;
}

int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>w[i];
    }
    build(1,1,n);
    for(int i=1;i<=m;i++){
        ll a,x,y,k;
        cin>>a>>x>>y;
        if(a==1){
            cin>>k;
            update(1,x,y,k);
        }else{
            ll ans = query(1,x,y);
            cout<<ans<<endl;
        }
    }
    system("pause");
    return 0;
}